#include "rda5807.h"


/*
**********************************************************************************************************
*	函 数 名: uint16_t rda5807_read_reg(uint8_t regAddr)
*	功能说明: 芯片读寄存器
*	形    参: 寄存器地址
*	返 回 值: 返回读取值
*********************************************************************************************************
*/
uint16_t rda5807_read_reg(uint8_t regAddr)
{
	//return 0;
#if 0
	uint16_t buf;
	uint8_t ack = 0;
	IIC_Start();
	IIC_Send_Byte(RDA_WRITE);//发送芯片地址方向为写
	ack = IIC_Wait_Ack();
	IIC_Send_Byte(regAddr);//发送寄存器地址
	ack = IIC_Wait_Ack();
	IIC_Start();
	IIC_Send_Byte(RDA_READ);//发送芯片地址方向为读
	ack = IIC_Wait_Ack();
	buf=IIC_Read_Byte(1);
	buf=buf<<8;
	buf=buf|IIC_Read_Byte(0);
	IIC_Stop();
	if(ack)
	{
		rda5807_debug("rda5807读取失败");
	}
	return buf;
#else

    uint8_t dummy[2]={0,0};
    uint8_t data=regAddr;

	if(i2c_master_write_read_device(I2C1_PORT_NUM, RDA5807_ADDR, &data, 1, dummy, 2, pdMS_TO_TICKS(I2C_MASTER_TIMEOUT_MS))==ESP_OK)
	{
		//bsp_i2c_debug("读取成功 地址:0x%02x 数据:0x%02x",regAddr,dummy[0]<<8|dummy[1]);
	}else
	{
		bsp_i2c_debug("读取失败");
	}

	return (uint16_t)(dummy[0]<<8)|dummy[1];
#endif

}
/*
**********************************************************************************************************
*	函 数 名: void rda5807_write_reg(uint8_t regAddr,uint16_t val)
*	功能说明: 芯片写寄存器
*	形    参: regAddr:寄存器地址 val:写入的值
*	返 回 值: 0成功 其他失败
*********************************************************************************************************
*/
uint8_t rda5807_write_reg(uint8_t regAddr,uint16_t val)
{
	//return 0;
#if 0
	uint8_t ack = 0;
	IIC_Start();
	IIC_Send_Byte(RDA_WRITE);//发送芯片地址方向为写
	ack = IIC_Wait_Ack();
	IIC_Send_Byte(regAddr);//发送寄存器地址
	ack = IIC_Wait_Ack();
	IIC_Send_Byte(val>>8);
	ack = IIC_Wait_Ack();
	IIC_Send_Byte(val&0XFF);
	ack = IIC_Wait_Ack();
	IIC_Stop();
	if(ack)
	{
		rda5807_debug("rda5807写入失败");
	}
	return ack;
#else

#if 1

	uint8_t ret=0;
    uint8_t write_buf[3] = {regAddr, (val>>8),(val&0xff)};

    ret = i2c_master_write_to_device(I2C1_PORT_NUM, RDA5807_ADDR, write_buf, sizeof(write_buf), pdMS_TO_TICKS(I2C_MASTER_TIMEOUT_MS));
	if(ret == ESP_OK)
	{
		ret = 0;
		//bsp_i2c_debug("写入成功1");
	}else
	{
		ret = 1;
		bsp_i2c_debug("写入失败1");
	}

#else

	uint8_t ret=0;
    uint8_t write_buf1[1] = {regAddr};
    uint8_t write_buf2[2] = {(val>>8)&0xff,val&0xff};

    ret = i2c_master_write_to_device(I2C1_PORT_NUM, RDA5807_ADDR, write_buf1, 1, pdMS_TO_TICKS(I2C_MASTER_TIMEOUT_MS));
	if(ret == ESP_OK)
	{
		ret = 0;
		//bsp_i2c_debug("写入成功1");
	}else
	{
		ret = 1;
		bsp_i2c_debug("写入失败1");
	}
    ret = i2c_master_write_to_device(I2C1_PORT_NUM, RDA5807_ADDR, write_buf2, 2, pdMS_TO_TICKS(I2C_MASTER_TIMEOUT_MS));
	if(ret == ESP_OK)
	{
		ret = 0;
		//bsp_i2c_debug("写入成功2");
	}else
	{
		ret = 1;
		bsp_i2c_debug("写入失败2");
	}
#endif

	return ret;
#endif
}
/*
**********************************************************************************************************
*	函 数 名: void rda5807_vol_set(uint8_t vol)
*	功能说明: 音量设置
*	形    参: vol:0~15
*	返 回 值: 无
*********************************************************************************************************
*/
void rda5807_vol_set(uint8_t vol)
{
	uint16_t temp=0;
	//rda5807_debug("设置音量:%d",vol);
	temp=rda5807_read_reg(RDA_R05);
	//rda5807_debug("读出音量:%x",temp);
	temp&=0xfff0;
	rda5807_write_reg(RDA_R05,vol|temp);
	temp=rda5807_read_reg(RDA_R05);
	//rda5807_debug("读出音量:%x",temp);
}
/*
**********************************************************************************************************
*	函 数 名: void rda5807_mute_set(uint8_t mute)
*	功能说明: 静音设置
*	形    参: mute:1:静音 0:不静音
*	返 回 值: 无
*********************************************************************************************************
*/
void rda5807_mute_set(uint8_t mute)
{
	uint16_t temp=0;
	temp=rda5807_read_reg(RDA_R02);
	if(!mute)temp|=1<<14;
	else
		temp&=~(1<<14);
	rda5807_write_reg(RDA_R02,temp);
}
/*
**********************************************************************************************************
*	函 数 名: void rda5807_bass_set(uint8_t bass)
*	功能说明: 频带设置
*	形    参: bass:
*	返 回 值: 无
*********************************************************************************************************
*/
/*void rda5807_bass_set(uint8_t bass)
{
	uint16_t temp=0;
	temp=rda5807_read_reg(0X02);
	if(bass)temp|=1<<12;
	else temp&=~(1<<12);
	rda5807_write_reg(0X02,temp);
}*/
/*
**********************************************************************************************************
*	函 数 名: uint8_t rda5807_rssi_get(void)
*	功能说明: 信号强度获取
*	形    参: 无
*	返 回 值: 0~63
*********************************************************************************************************
*/
uint8_t rda5807_rssi_get(void)//信号强度获取0~63
{
	uint16_t temp=0;
	temp=rda5807_read_reg(RDA_R0B);
	temp=(temp>>9)&0x7f;
	return (uint8_t)temp;
}
/*
**********************************************************************************************************
*	函 数 名: void Seekth_Set(uint16_t rssi)
*	功能说明: 自动搜台信号阈值强度默认为8数值越低搜到的台越多
*	形    参: rssi:0-15
*	返 回 值: 无
*********************************************************************************************************
*/
void rda5807_seekth_set(uint16_t rssi)
{
	uint16_t temp;
	rssi=rssi&0xf;
	temp=rda5807_read_reg(RDA_R05);
	temp&=~(0xf<<8);
	temp|=rssi<<8;
	rda5807_write_reg(RDA_R05,temp);

}
/*
**********************************************************************************************************
*	函 数 名: void rda5807_seek_direction(uint8_t direction)
*	功能说明: 自动搜台方向
*	形    参: direction:1:向上搜索 0:向下搜索
*	返 回 值: 无
*********************************************************************************************************
*/
void rda5807_seek_direction(uint8_t direction)//搜台方向1向上搜索0向下搜索
{
	uint16_t temp;
	temp=rda5807_read_reg(RDA_R02);
//	temp&=~(1<<9);
	if(direction==1)
		temp|=1<<9;
	else if(direction==0)
		temp&=~(1<<9);
	rda5807_write_reg(RDA_R02,temp);
}


void rda5807_seek_channel_no_block(void)
{

	uint16_t temp;
	temp=rda5807_read_reg(RDA_R02);
	temp|=(1<<8);  //开启搜索
	rda5807_write_reg(RDA_R02,temp);//SEEK位置一使能自动搜台
}
uint8_t rda5807_seek_wait(void)
{
	return (rda5807_read_reg(RDA_R0A)&(1<<14));
}



/*
**********************************************************************************************************
*	函 数 名: uint16_t rda5807_seek_channel(void)
*	功能说明: 自动搜台
*	形    参: 无
*	返 回 值: 返回0 失败 返回1成功
*********************************************************************************************************
*/
uint16_t rda5807_seek_channel(void)
{
	uint16_t i=0;
	uint16_t temp;

	//	CPU_SR_ALLOC();

	temp=rda5807_read_reg(RDA_R02);
	temp|=(1<<8);  //开启搜索
	rda5807_write_reg(RDA_R02,temp);//SEEK位置一使能自动搜台
	while((rda5807_read_reg(RDA_R0A)&(1<<14))==0)//等待STC位置一表示搜索完成
	{
//		OSTimeDlyHMSM(0,0,0,20,OS_OPT_TIME_PERIODIC,&err);//延时50ms
		vTaskDelay(10);
		i++;
		if(i>20)
			return 0;

		//printf("搜台ing...\r\n");
	}
//	temp2=(uint16_t)(rda5807_read_reg(RDA_R0A)&0x3FF)*100000+87000000;//获取当前频率
//	return (uint16_t)(temp2/10000);//返回搜到电台频率单位是：10Khz
//	vTaskDelay(10);//延时10ms

////	return rda5807_freg_get(); //得到当前频率
	return 1;
}
/*
**********************************************************************************************************
*	函 数 名: uint16_t rda5807_freg_get(void)
*	功能说明: 得到当前频率
*	形    参: 无
*	返 回 值: 搜到电台频率单位是：10Khz
*********************************************************************************************************
*/
uint16_t rda5807_freg_get(void)
{
	uint16_t temp2;
	//uint32_t temp1=0;
	temp2=(rda5807_read_reg(RDA_R0A)&0x03FF);//获取当前频率
	//temp1 = (uint32_t)temp2*100000+87000000;
//	temp2=(uint16_t)(rda5807_read_reg(RDA_R0A)&0x3FF)*100000+87000000;//获取当前频率
//	return (uint16_t)(temp2/10000);//返回搜到电台频率单位是：10Khz
	return temp2+870;//(uint16_t)(temp1/10000);//返回搜到电台频率单位是：100Khz

}
/*
**********************************************************************************************************
*	函 数 名: void rda5807_freq_set(uint16_t freq)
*	功能说明: 单位是：10KHz 6500~10800
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void rda5807_freq_set(uint16_t freq)
{
    //TickType_t tick = xTaskGetTickCount();

	uint16_t temp;
	uint8_t spc=0,band=0;
	uint16_t fbtm,chan;
	temp=rda5807_read_reg(0X03);
	temp&=0X001F;
	band=(temp>>2)&0x03;
	spc=temp&0x03;
	if(spc==0)
		spc=10;
	else if(spc==1)
		spc=20;
	else spc=5;
	if(band==0)
		fbtm=8700;
	else if(band==1||band==2)
		fbtm=7600;
	else{
		fbtm=rda5807_read_reg(0X53);
		fbtm*=10;
		}
	if(freq<fbtm)
		return;
	chan=(freq-fbtm)/spc;
	chan&=0X3FF;
	temp|=chan<<6;
	temp|=1<<4;
	rda5807_write_reg(RDA_R03,temp);
	rda5807_debug("set frequency:%d",freq);
	//vTaskDelay(pdMS_TO_TICKS(200));
	//vTaskDelayUntil(&tick, pdMS_TO_TICKS(200));
	// while((rda5807_read_reg(0X0B)&(1<<7))==0)
	// {
	// 	vTaskDelayUntil(&tick, pdMS_TO_TICKS(200));
	// }
	//rda5807_debug("set frequency finished");
}
/*
**********************************************************************************************************
*	函 数 名: uint8_t rda5807_freq_set_get_sta(void)
*	功能说明: 设置频率后获取状态
*	形    参: 1:设置好了 0:没有设置好
*	返 回 值: 无
*********************************************************************************************************
*/
uint8_t rda5807_freq_set_get_sta(void)
{
	return (rda5807_read_reg(0X0B)&(1<<7));
}
/*
**********************************************************************************************************
*	函 数 名: void rda5807_enable(uint8_t flag)
*	功能说明: 开关
*	形    参: 1:使能芯片 0:禁用芯片
*	返 回 值: 无
*********************************************************************************************************
*/
void rda5807_enable(uint8_t flag)
{
	uint16_t temp;
	temp=rda5807_read_reg(RDA_R02);
	if(flag==1)
		temp |=0x01;
	if(flag==0)
		temp &=~0x1;
	rda5807_write_reg(RDA_R02,temp);
}
/*
**********************************************************************************************************
*	函 数 名: void rda5807_enable(uint8_t flag)
*	功能说明: RDA5807初始化
*	形    参: 无
*	返 回 值: 无
*********************************************************************************************************
*/
void rda5807_init(void)
{
	uint8_t buf[2];
	uint8_t ack = 0;
	uint16_t id=0;
	id = rda5807_read_reg(RDA_R00);
	if(id == 0x5804)
	{
		rda5807_debug("rda5807 id 正确");
	}else
	{
		rda5807_debug("rda5807 id 错误");
	}
	ack = rda5807_write_reg(RDA_R02,0x0002);//软件复位
	if(ack)
	{
		rda5807_debug("rda5807初始化失败!");
		return;
	}

	TickType_t tick = xTaskGetTickCount();
	vTaskDelayUntil(&tick, pdMS_TO_TICKS(500));

	rda5807_write_reg(RDA_R02,0xd281);	//晶振选择32.768Khz向上搜索重低音立体声SKMODE=1搜索到边频时停止
	rda5807_write_reg(RDA_R03,0x0000);	//频率设为87MHz，步进100Khz频带为87M~108M
	rda5807_write_reg(RDA_R04,0x0040);	//基本配置
	rda5807_write_reg(RDA_R05,0X8882);	//音量设置为vol=2搜索阀值为8
	rda5807_enable(1);
	rda5807_debug("rda5807初始化成功!");


}
